/**
 * 
 */
package db;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import model.Artikel;
import model.Bestellposten;
import model.Bestellung;
import model.Datum;
import model.Kunde;
import model.Mitarbeiter;
import model.Person;

/**
 * @author spiller.sebastian
 *
 */
public class BestellungBuilder implements BestellungSource{
	
	private static DbManager DbManagerInstance = DbManager.getInstance();
	private static BestellungBuilder BestellungBuilderInstance;
	
	private BestellungBuilder(){
	}
	
	/**
	 * @return
	 */
	public static BestellungBuilder getInstance() {
		if (BestellungBuilder.BestellungBuilderInstance == null) {
			BestellungBuilder.BestellungBuilderInstance = new BestellungBuilder();
		}
		return BestellungBuilder.BestellungBuilderInstance;
	}
	
	/* (non-Javadoc)
	 * @see db.BestellungSource#getAllBestellung()
	 */
	public List<Bestellung> getAllBestellung() {
		
		try {
			
			ResultSet rs = DbManagerInstance.getCon().createStatement()
				.executeQuery("SELECT * FROM t_bestellung");
			
			
			List<Bestellung> listBestellung = new ArrayList<Bestellung>();
			List<Bestellposten> listBestellposten = new ArrayList<Bestellposten>();
			
			while (rs.next()) {
				
				listBestellposten = DbManagerInstance.getBestellpostenBuilder().getBestellpostenByAuftragsnummer(rs.getInt("auftragsnummer"));
				
				Bestellung bestellung = new Bestellung(
					rs.getInt("auftragsnummer"),
					rs.getString("status"),
					rs.getDouble("versandkosten"),
					new Datum(rs.getDate("bestelldatum")),
					DbManagerInstance.getPersonBuilder().getKunde(rs.getInt("auftraggeber_id")),
					DbManagerInstance.getPersonBuilder().getMitarbeiter(rs.getInt("sachbearbeiter_id")),
					listBestellposten);

				listBestellung.add(bestellung);
			}
			
			return listBestellung;
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/* (non-Javadoc)
	 * @see db.BestellungSource#add(model.Bestellung)
	 */
	public void add(Bestellung bestellung) {
	
		try {
			ResultSet rs = DbManagerInstance.getCon().createStatement()
				.executeQuery("INSERT INTO t_bestellung" +
					" (auftragsnummer, status, anzahl, bestellung_id, artikel_id) VALUES (" +
					String.valueOf(bestellung.getAuftragsnummer()) + "," +
					bestellung.getStatus() + "," +
					String.valueOf(bestellung.getVersandkosten()) + "," +
					String.valueOf(bestellung.getBestelldatum()) + "," +
					String.valueOf(bestellung.getAuftraggeber()) + "," +
					String.valueOf(bestellung.getSachbearbeiter() + ")"));

			DbManagerInstance.getBestellpostenBuilder().add(bestellung.getPosten());
		}	
		 catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/* (non-Javadoc)
	 * @see db.BestellungSource#update(model.Bestellung)
	 */
	public void update(Bestellung bestellung) {
		// TODO Next Iteration
	}
	
	/* (non-Javadoc)
	 * @see db.BestellungSource#remove(model.Bestellung)
	 */
	public void remove(Bestellung bestellung) {
		try {
			ResultSet rs = DbManagerInstance.getCon().createStatement()
				.executeQuery("DELETE FROM t_bestellung WHERE" +
					" auftragsnummer = " + bestellung.getAuftragsnummer());

			DbManagerInstance.getBestellpostenBuilder().removeByAuftragsnummer(bestellung.getAuftragsnummer());
		}	
		 catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public void remove(Bestellposten bestellposten) {
		DbManagerInstance.getBestellpostenBuilder().remove(bestellposten);
	}
}